package com.misyi.designpattern.singleton;

/**
 * 线程安全的饱汉模式
 *
 * @author licong
 * @date 2021-09-11 下午9:57
 */
public class SafeFullSingletonPatternDemo {

    public static class Singleton {

        private static Singleton instance;

        private Singleton() {

        }

        // 这个模式还是不完美的, 因为不同的JVM内部原理, 可能还是不是线程安全的
        public static Singleton getInstance() {
            /*
             * 防止实例已经创建的情况下, 都进入到同步代码的判断中, 提高性能
             */
            if (instance == null) {

                // 1. 线程1尝试加锁, 获取锁后, 继续向下执行
                // 2. cpu 切换到线程2, 线程2尝试加锁, 获取锁失败, 线程挂起, 等待其他线程释放锁
                // 5. 线程2获取锁, 继续向下执行
                synchronized (Singleton.class) {
                    // 3. 线程1判断 instance == null, 执行 instance = new Singleton(), 创建实例
                    // 6. 此处采用 double check, 判断 instance 已经被创建, 则不用重复创建, 直接返回线程1创建的实例
                    if (instance == null) {
                        instance = new Singleton();
                    }
                }
                // 4. 线程1执行完代码, 释放锁
            }
            return instance;
        }

    }

}
